package com.shxy.cloudclassroom.service;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.shxy.cloudclassroom.entity.dto.EditUserDTO;
import com.shxy.cloudclassroom.entity.pojo.*;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.multipart.MultipartFile;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

public interface AdminService {
    /**
     * 获取管理员主页数据
     * @param session 用户会话
     * @param userService 用户服务
     * @param learningResourceService 学习资源服务
     * @param assignmentService 作业服务
     * @param forumPostService 帖子服务
     * @param forumReplyService 回复服务
     * @param majorService 专业服务
     * @return 主页数据
     */
    com.shxy.cloudclassroom.entity.vo.AdminDashboardVO getAdminIndexData(HttpSession session, UserService userService,
                                         LearningResourceService learningResourceService,
                                         AssignmentService assignmentService,
                                         ForumPostService forumPostService,
                                         ForumReplyService forumReplyService,
                                         MajorService majorService);

    /**
     * 更新管理员头像
     * @param file 头像文件
     * @param session 用户会话
     * @param ossService OSS服务
     * @param userService 用户服务
     * @return 更新结果
     */
    Map<String, Object> updateAvatar(MultipartFile file, HttpSession session, OssService ossService, UserService userService);

    /**
     * 获取所有用户列表
     * @param id 用户ID
     * @param userService 用户服务
     * @return 用户列表
     */
    List<User> getAllUsers(Long id, UserService userService);

    /**
     * 获取所有管理员列表
     * @param userService 用户服务
     * @return 管理员列表
     */
    List<User> getAllAdmins(UserService userService);

    /**
     * 获取所有学习资源
     * @param learningResourceService 学习资源服务
     * @return 学习资源列表
     */
    List<LearningResource> getAllResources(LearningResourceService learningResourceService);

    /**
     * 获取所有作业
     * @param assignmentService 作业服务
     * @return 作业列表
     */
    List<Assignment> getAllAssignments(AssignmentService assignmentService);

    /**
     * 获取所有帖子
     * @param forumPostService 帖子服务
     * @return 帖子列表
     */
    List<ForumPost> getAllPosts(ForumPostService forumPostService);

    /**
     * 获取所有回复
     * @param forumReplyService 回复服务
     * @return 回复列表
     */
    List<ForumReply> getAllReplies(ForumReplyService forumReplyService);

    /**
     * 获取用户映射
     * @param users 用户列表
     * @return 用户映射
     */
    Map<Long, String> getUserMap(List<User> users);

    /**
     * 获取专业映射
     * @param majorService 专业服务
     * @return 专业映射
     */
    Map<Integer, String> getMajorMap(MajorService majorService);

    /**
     * 获取帖子映射
     * @param posts 帖子列表
     * @return 帖子映射
     */
    Map<Long, String> getPostMap(List<ForumPost> posts);

    /**
     * 提升用户为管理员
     * @param userId 用户ID
     * @param userService 用户服务
     * @return 操作结果
     */
    Map<String, Object> promoteToAdmin(Long userId, UserService userService);

    /**
     * 根据ID删除用户
     * @param id 用户ID
     * @param session 用户会话
     * @param userService 用户服务
     * @return 操作结果
     */
    Map<String, Object> delUserById(Long id, HttpSession session, UserService userService);

    /**
     * 更新用户信息
     * @param editUserDTO 用户信息DTO
     * @param session 用户会话
     * @param userService 用户服务
     * @return 操作结果
     */
    Map<String, Object> updateUser(EditUserDTO editUserDTO, HttpSession session, UserService userService);

    /**
     * 将管理员降级为普通用户
     * @param userId 用户ID
     * @param session 用户会话
     * @param userService 用户服务
     * @return 操作结果
     */
    Map<String, Object> demoteToUser(Long userId, HttpSession session, UserService userService);

    /**
     * 将普通用户提升为管理员
     * @param userId 用户ID
     * @param userService 用户服务
     * @return 操作结果
     */
    Map<String, Object> promoteUserToAdmin(Long userId, UserService userService);

    /**
     * 根据ID删除管理员
     * @param id 管理员ID
     * @param session 用户会话
     * @param userService 用户服务
     * @return 操作结果
     */
    Map<String, Object> delAdminById(Long id, HttpSession session, UserService userService);

    /**
     * 删除学习资源
     * @param resourceId 资源ID
     * @param downloadHistoryService 下载历史服务
     * @param viewHistoryService 浏览历史服务
     * @param assignmentService 作业服务
     * @param assignmentSubmissionService 作业提交服务
     * @param learningResourceService 学习资源服务
     * @return 操作结果
     */
    Map<String, Object> deleteResource(Long resourceId, DownloadHistoryService downloadHistoryService,
                                      ViewHistoryService viewHistoryService, AssignmentService assignmentService,
                                      AssignmentSubmissionService assignmentSubmissionService,
                                      LearningResourceService learningResourceService);

    /**
     * 获取学习资源详情
     * @param id 资源ID
     * @param majorService 专业服务
     * @param learningResourceService 学习资源服务
     * @return 资源详情
     */
    Map<String, Object> getResource(Long id, MajorService majorService, LearningResourceService learningResourceService);

    /**
     * 获取作业详情
     * @param id 作业ID
     * @param majorService 专业服务
     * @param assignmentService 作业服务
     * @return 作业详情
     */
    Map<String, Object> getAssignment(Long id, MajorService majorService, AssignmentService assignmentService);

    /**
     * 添加作业或考试
     * @param title 标题
     * @param majorId 专业ID
     * @param description 描述
     * @param deadline 截止时间
     * @param file 文件
     * @param session 用户会话
     * @param ossService OSS服务
     * @param assignmentService 作业服务
     * @return 操作结果
     */
    Map<String, Object> addAssignment(String title, Integer majorId, String description, String deadline,
                                     MultipartFile file, HttpSession session, OssService ossService,
                                     AssignmentService assignmentService);

    /**
     * 删除作业或考试
     * @param assignmentId 作业ID
     * @param assignmentSubmissionService 作业提交服务
     * @param assignmentService 作业服务
     * @return 操作结果
     */
    Map<String, Object> deleteAssignment(Long assignmentId, AssignmentSubmissionService assignmentSubmissionService,
                                        AssignmentService assignmentService);

    /**
     * 获取作业提交列表
     * @param assignmentId 作业ID
     * @param assignmentSubmissionService 作业提交服务
     * @return 提交列表
     */
    Map<String, Object> getAssignmentSubmissions(Long assignmentId, AssignmentSubmissionService assignmentSubmissionService);

    /**
     * 批改作业
     * @param submissionId 提交ID
     * @param score 分数
     * @param comment 评语
     * @param assignmentSubmissionService 作业提交服务
     * @return 批改结果
     */
    Map<String, Object> gradeSubmission(Long submissionId, BigDecimal score, String comment,
                                       AssignmentSubmissionService assignmentSubmissionService);

    /**
     * 置顶帖子
     * @param postId 帖子ID
     * @param isTop 是否置顶
     * @param forumPostService 帖子服务
     * @return 操作结果
     */
    Map<String, Object> topPost(Long postId, Integer isTop, ForumPostService forumPostService);

    /**
     * 加精帖子
     * @param postId 帖子ID
     * @param isElite 是否加精
     * @param forumPostService 帖子服务
     * @return 操作结果
     */
    Map<String, Object> highlightPost(Long postId, Integer isElite, ForumPostService forumPostService);

    /**
     * 取消加精帖子
     * @param postId 帖子ID
     * @param forumPostService 帖子服务
     * @return 操作结果
     */
    Map<String, Object> unhighlightPost(Long postId, ForumPostService forumPostService);

    /**
     * 删除帖子
     * @param postId 帖子ID
     * @param forumReplyService 回复服务
     * @param forumPostService 帖子服务
     * @return 操作结果
     */
    Map<String, Object> deletePost(Long postId, ForumReplyService forumReplyService, ForumPostService forumPostService);

    /**
     * 删除评论
     * @param replyId 评论ID
     * @param forumReplyService 回复服务
     * @return 操作结果
     */
    Map<String, Object> deleteReply(Long replyId, ForumReplyService forumReplyService);

    /**
     * 验证是否为超级管理员
     * @param session 用户会话
     * @return 是否为超级管理员
     */
    boolean verifyAdmin(HttpSession session);
}